//
//  NHT_Bluetooth.h
//  DevelopDemo
//
//  Created by NHT on 2024/6/12.
//

#import <Foundation/Foundation.h>
#import <CoreBluetooth/CoreBluetooth.h>

NS_ASSUME_NONNULL_BEGIN

@interface NHT_Bluetooth : NSObject

///低功耗蓝牙连接状态的改变事件对应值
typedef NS_ENUM(NSInteger, BLEConnectionStateChange) {
    ///连接失败
    BLEConnectionStateChangeFail = 0,
    ///连接成功
    BLEConnectionStateChangeSucess,
    ///连接断开
    BLEConnectionStateChangeBreak,
    ///连接超时
    BLEConnectionStateChangeTimeOut,
};


+(instancetype)shareBluetooth;

-(void)openBluetoothAdapter;//    初始化蓝牙模块
-(void)startBluetoothDevicesDiscovery;//   搜寻附近的蓝牙外围设备
/// 监听寻找到新设备的事件
@property (nonatomic,copy) void(^onBluetoothDeviceFound)(NSDictionary *resultInfo);

///停止搜寻
-(void)stopBluetoothDevicesDiscovery;

/**
 监听蓝牙适配器状态变化事件，结果字段说明
 result：蓝牙状态结果(0：未知；1：重置中；2：不支持；3：未被授权使用；4：蓝牙未打开；5：蓝牙已打开)；
 result_descr：蓝牙状态结果描述；
 */
@property (nonatomic,copy) void(^onBluetoothAdapterStateChange)(NSDictionary *resultInfo);

//-(void)getConnectedBluetoothDevices;//    根据 uuid 获取处于已连接状态的设备
//-(void)getBluetoothDevices;//    获取已发现的蓝牙设备
//-(void)getBluetoothAdapterState;//    获取本机蓝牙适配器状态
//-(void)closeBluetoothAdapter;//    关闭蓝牙模块


///向低功耗蓝牙设备特征值中写入数据(参数必须是10进制的数组成的数组eg：@[@"1",@"3"],@"15",@"18"])
-(NSData *)writeBLECharacteristicValue:(NSArray *)wirteDataArr;

//-(void)readBLECharacteristicValue;//     读取低功耗蓝牙设备的特征值的二进制数据值

/**
 监听低功耗蓝牙连接状态的改变事件，结果字段说明
 result：蓝牙连接结果(0：连接失败；1：连接成功；2：连接断开；3：超时，连接失败；
 result_descr：蓝牙连接结果描述；
 name：蓝牙名称；deviceId：蓝牙id（UUIDString）；peripheral：当前连接的蓝牙；
 error：错误信息；error_code：错误信息的code；error_domain：错误信息的domain；error_userInfo：错误信息的userInfo；
 */
@property (nonatomic,copy) void(^onBLEConnectionStateChange)(NSDictionary *resultInfo);


/**
 监听低功耗蓝牙设备的特征值变化事件----接收到的数据，结果字段说明
 value_original：接收到的原始数据
 value_number:接收到的数据，转换为十进制数字后的数组
 */
@property (nonatomic,copy) void(^onBLECharacteristicValueChange)(NSDictionary *resultInfo);

/**
 启用蓝牙低功耗设备特征值变化时的 notify 功能，订阅特征的回调,结果字段说明
 result：(0：订阅失败；1：订阅成功；2：订阅失败，超时，会自动断开蓝牙连接)；
 result_descr：结果描述；
 name：蓝牙名称；deviceId：蓝牙id（UUIDString）；peripheral：当前连接的蓝牙；
 error：错误信息；error_code：错误信息的code；error_domain：错误信息的domain；error_userInfo：错误信息的userInfo；
 */
-(void)notifyBLECharacteristicValueChange:(void (^)(NSDictionary *resultInfo))resultBlock;

/// 获取蓝牙设备所有服务(service)
-(void)getBLEDeviceServices;
///获取蓝牙设备某个服务中所有特征值(characteristic)
-(void)getBLEDeviceCharacteristics:(CBService *)service;


///连接低功耗蓝牙设备
-(void)createBLEConnection:(NSString *)deviceId;
///断开与低功耗蓝牙设备的连接
-(void)closeBLEConnection;


#pragma mark---自定义内容
///指定能连接的特征值的UUID，不是这个特征值的不能连接
@property (nonatomic,copy) NSString  *connectCBCharacteristicUUID;
///连接蓝牙的超时时间，超时之后就提示连接失败，默认为10，10秒
@property (nonatomic,assign) NSInteger  connectTimeoutValue;

///获取能读写的特征值
-(void)getWriteNotifyCharacteristic:(void (^)(NSInteger state))resultBlock;

#pragma mark---字符串和数字数组之间的转换
/// 字符串转data，转码格式为kCFStringEncodingGB_18030_2000
/// - Parameter string: 待转码字符串
-(NSArray *)stringToDataNumberArr:(NSString *)string;

/// 字符串转data
/// - Parameters:
///   - string: 待转码字符串
///   - length: 结果最小长度，-1代表不自动添加到所需长度
///   - encoding: 转码格式，比如：CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000)
-(NSArray *)stringToDataNumberArr:(NSString *)string length:(int)length encoding:(NSStringEncoding)encoding;

/// 数组通过解码转换成文字，解码格式为kCFStringEncodingGB_18030_2000
/// - Parameter numberDataArr: 待解码内容
-(NSString *)numberArrToString:(NSArray *)numberDataArr;

/// 数组通过解码转换成文字
/// - Parameters:
///   - numberDataArr: 待解码内容
///   - encoding: 解码格式
-(NSString *)numberArrToString:(NSArray *)numberDataArr encoding:(NSStringEncoding)encoding;

@end

NS_ASSUME_NONNULL_END
